package com.ideaaedi.zoo.example.springboot.seata_dynamicds.alpha.controller;

import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ideaaedi.zoo.example.springboot.seata_dynamicds.alpha.service.BizService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping
@Tag(name ="测试")
public class TestController {
    
    @Resource
    private BizService bizService;
    
    /**
     * <pre>
     * 断点时，观察数据：oracle.teacher表有：
     *                           Beta 蒋老师    (这条数据是beta服务添加的)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                 mysql.teacher表有：
     *                           Beta 夏洛       (这条数据是beta服务添加的)
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/test")
    @Operation(summary = "【注解方式】本地添加alpha（student）数据，feign调用beta服务添加beta（student、teacher）数据，本地再触发失败")
    @ApiOperationSupport(order = 1)
    public void test() {
        bizService.test();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：oracle.teacher表有：
     *                           Beta 蒋老师    (这条数据是beta服务添加的)
     *                           Beta 蒋老师    (这条数据是beta服务添加的)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                 mysql.teacher表有：
     *                           Beta 夏洛       (这条数据是beta服务添加的)
     *                           Beta 夏洛       (这条数据是beta服务添加的)
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testNested")
    @Operation(summary = "【注解方式】测试GlobalTransactional注解嵌套")
    @ApiOperationSupport(order = 2)
    public void testNested() {
        bizService.testNested();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：oracle.teacher表有：
     *                           Beta 蒋老师    (这条数据是beta服务添加的)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                 mysql.teacher表有：
     *                           Beta 夏洛       (这条数据是beta服务添加的)
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testManual")
    @Operation(summary = "【手动方式】本地添加alpha（student）数据，feign调用beta服务添加beta（student、teacher）数据，本地再触发失败")
    @ApiOperationSupport(order = 3)
    public void testManual() {
        bizService.testManual();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：oracle.teacher表有：
     *                           Beta 蒋老师    (这条数据是beta服务添加的)
     *                           Beta 蒋老师    (这条数据是beta服务添加的)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                           Alpha 蒋老师    (这条数据是本服务添加的，因为bizService.test()方法上的Transactional注解管理的mysqlAlpha数据源，而添加这个数据的方法走的是oracleAlpha数据源，所以这里也添加进去了)
     *                 mysql.teacher表有：
     *                           Beta 夏洛       (这条数据是beta服务添加的)
     *                           Beta 夏洛       (这条数据是beta服务添加的)
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testNestedManual")
    @Operation(summary = "【手动方式】测试GlobalTransactional注解嵌套")
    @ApiOperationSupport(order = 4)
    public void testNestedManual() {
        bizService.testNestedManual();
    }
}
